#!/usr/bin/python
# -*- coding: UTF8 -*-

u'''Na União Soviética, a Reversal Russa implementa este módulo.
Precisa do pacote (Debian/Ubuntu) brazilian-conjugate.
'''

import sys
from subprocess import Popen, PIPE

vowels = ['a', 'e', 'i', 'o', 'u']

# Artigos
articles = ['o', 'os', 'a', 'as', 'um', 'uns', 'uma', 'umas']

# Preposições
prepositions = ['a', 'ante', u'após', u'até', 'com', 'contra', 'de',
                'desde', 'em', 'entre', 'para', 'per', 'perante',
                'por', 'sem', 'sob', 'sobre', u'trás']

# Locuções prepositivas
loc_prep = {
    'do' : ('de', 'o'), 'da' : ('de', 'a'),
    'dos' : ('de', 'os'), 'das' : ('de', 'as'),
    'no' : ('em', 'o'), 'na' : ('em', 'a'),
    'nos' : ('em', 'os'), 'nas' : ('em', 'as'),
    'num' : ('em', 'um'), 'numa' : ('em', 'uma'),
    'nuns' : ('em', 'uns'), 'numas' : ('em', 'umas'),
    'pelo' : ('por', 'o'), 'pela' : ('por', 'a'),
    'ao' : ('a', 'o'), 'à' : ('a', 'a')
}

conjugations = {
    'er' : ['beb', 'fod', 'diz'],
    'ir' : ['fug', 'sa', 'ca']
}

exceptions = {
    'dou' : u'dá',
    'vou' : 'vai',
    'valho' : 'vale',
    'perco' : 'perde',
    u'peço' : 'pede',
    u'meço' : 'mede',
    u'ouço' : 'ouve',
}

def get_root(verb):
    if verb[-2] in vowels:
        root = verb[:-2]
    else:
        root = verb[:-1]
    return root

def conjugue(verb):
    '''Recebe raiz do verbo e retorna conjugação na terceira pessoa
    do presente do indicativo.
    '''

    # Very naive
    root = get_root(verb)
    inf_suffix = u'ar'

    for conjug, members in conjugations.items():
        if root in members:
            inf_suffix = conjug
            break

    infinitive = root + inf_suffix

    p1 = Popen(['conjugue', '-v', 'FORMATO=n', '-v', 'CMD=%s' % infinitive],
               stdout=PIPE)
    p2 = Popen(['grep', '^PI'], stdin=p1.stdout, stdout=PIPE)
    result = p2.communicate()
    return result[0].split(':')[3]

def russian_reversal(phrase):
    words = phrase.lower().split(' ')

    # Removemos o pronome 'eu', caso ele não seja oculto.
    if words[0] == 'eu':
        words = words[1:]

    # A primera palavra é o verbo de ação, que está na primeira
    # pessoa do presente do indicativo. Vamos mudá-lo para a
    # terceira pessoa do presente do indicativo.
    # TODO: identificar os paradigmas seguindo o modelo do conjugate.
    # e.g.: saio, caio -> paradigma -air: sair, cair.
    #       exceção: vaiar, vaio, vaia
    if words[0] in exceptions:
        words[0] = exceptions[words[0]]
    else:
        words[0] = conjugue(words[0])

    # Encontramos o artigo, se preciso extraímos ele de uma
    # combinação com preposição.
    split_pos = 0
    for i in xrange(len(words)):
        if words[i] in loc_prep:
            preposition, article = loc_prep[words[i]]
            split_pos = i + 1
            words[i] = preposition
            words.insert(split_pos, article)
            break

        elif words[i] in articles:
            split_pos = i
            break

        elif words[i] in prepositions:
            split_pos = i + 1
            break

    subject = words[split_pos:]
    rest = words[:split_pos]
    return u'Na União Soviética, %s %s você!' % (u' '.join(subject), u' '.join(rest))

def main():
    if len(sys.argv) < 2:
        # formato:
        # [eu] <verbo|locução v.> [preposição] <artigo> <objeto direto e/ou indireto>
        phrases = [
            u'eu programo em python',
            u'alimento o cachorro',
            u'eu caio do muro',
            u'eu caio o muro',
            u'eu compro um ingresso',
            u'bebo uma vodka',
            u'eu escapo da casa',
            u'eu escapo correndo da casa',
            u'eu saio da casa',
            u'eu vou andando feliz pela calçada estreita',
            u'eu ataco o dragão verde',
            u'eu dou à luz o meu filho',
            u'fico atormentado pelo remorso'
        ]

        for phrase in phrases:
            print u'"%s" -> "%s"' % (phrase, russian_reversal(phrase))

    elif sys.argv[1].startswith('--conjugue='):
        word = sys.argv[1].split('=')[-1]
        print 'Conjugue "%s": %s' % (word, conjugue(word))

    else:
        phrase = unicode(sys.argv[1])

if __name__ == '__main__':
    main()

